#include "delay.h"
#include "sys.h"
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_exti.h"
#include "stm32f10x_tim.h"
#include "misc.h"
#include "led.h"
#include "lcd_init.h"
#include "lcd.h"
#include "pic.h"
#include "sd.h"	
#include "malloc.h"
//SD卡驱动
#include "ff.h"  
#include "diskio.h"
#include "stdlib.h"
//文件系统驱动
#include "sc_gui.h"
//STM32F103 Bootloader 前32K作为BootLoader运行地址
//此项目为兼容GD32工程已修改以下参数
//1.#define HSE_STARTUP_TIMEOUT ((uint16_t)0x0500) 修改为 ((uint16_t)0xFFFF)
//2.以下四个函数KEY后添加 两个__NOP();
//FLASH_Status FLASH_EraseOptionBytes(void)
//FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint8_t Data)
//FLASH_Status FLASH_EnableWriteProtection(uint32_t FLASH_Pages)
//FLASH_Status FLASH_ReadOutProtection(FunctionalState NewState)
//3.
//#define EraseTimeout ((uint32_t)0x000B0000) 修改为 ((uint32_t)0x000FFFFF)
//#define ProgramTimeout ((uint32_t)0x00002000)  修改为 ((uint32_t)0x0000FFFF)


u32 sd_size;  //SD卡容量 MB

void Encoder_Init()//使用定时器的编码器读取
{
 GPIO_InitTypeDef GPIO_InitStructure; //定义一个GPIO结构体
 TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;//定义一个定时器结构体变量
 TIM_ICInitTypeDef TIM_ICInitStructure; //定义一个定时器编码器结构体变量
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能GPIOA时钟
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//使能定时器2
	
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;  //配置PA0->TIM2_CH1,PA1->TIM2_CH2
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //设置50MHz时钟
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  //设置为浮空输入模式
 GPIO_Init(GPIOA, &GPIO_InitStructure);
 
 TIM_TimeBaseStructure.TIM_Prescaler = 0x0; //时钟不分频
 TIM_TimeBaseStructure.TIM_Period = 0xffff; //计数器最大值
 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //使用采样频率之间的分频比例
 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //初始化定时器2
 TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI1,TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
 TIM_ICStructInit(&TIM_ICInitStructure);
 TIM_ICInitStructure.TIM_ICFilter = 6;
 TIM_ICInit(TIM2, &TIM_ICInitStructure);
 TIM_ClearFlag(TIM2, TIM_FLAG_Update);
 TIM_ITConfig(TIM2, TIM_FLAG_Update,ENABLE);
 TIM_SetCounter(TIM2,0);
 TIM_Cmd(TIM2, ENABLE);  //计数器使能，开始计数
 
//*************************************************************************
//LCD_ShowIntNum(160,200,TIM_GetCounter(TIM2),5,BLACK,WHITE,16);//显示编码器值
//*************************************************************************
}





//#define KEY  GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2)//读取按键
void KEY_Init()
{
	GPIO_InitTypeDef GPIO_InitStructure;
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PORTA,PORTC时钟
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_2;//PA2
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //设置成上拉输入
 	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA2
} 
u8 KEY()
{
	if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2)==0)
	{
		delay_ms(10);//去抖动 
		if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2)==0)return 1;
		else return 0;// 无按键按下
	}else     
	return 0;// 无按键按下
}
u8 E_A()
{
	if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==0)
	{
		delay_ms(10);//去抖动 
		if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==0)return 1;
		else return 0;// 无按键按下
	}else     
	return 0;// 无按键按下
}
u8 E_B()
{
	if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)==0)
	{
		delay_ms(10);//去抖动 
		if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1)return 1;
		else return 0;// 无按键按下
	}else     
	return 0;// 无按键按下
}


void Show_file( u8 *p)
{
	
	FATFS fs;  
	FIL fid;
	FRESULT res;
	disk_initialize(0);						     //fatfs可以管理多个介质的分区
	f_mount(0, &fs);							     //将文件系统设置到0区 		 	  
	res = f_open(&fid,(u8*)p, FA_READ);

	if(res != FR_OK) //如果打开失败，退出运行程序
	 {
		 LCD_ShowString(160,85,"File Error",BLACK,WHITE,16,0);
   }
	else
	{
		LCD_ShowString(160,85,"test.txt",BLACK,WHITE,16,0);
		
	char str[100];
	for(u8 i=0;i<16;i++)//显示打开内容
	{
	f_gets(str,sizeof(str),&fid);
	if(strlen(str)==0)break;
	LCD_ShowString(160,105+i*17,(u8 *)str,BLACK,WHITE,16,0);
	}
}
	
	
}


void Show_picture(u16 x,u16 y,u16 w,u16 h,u8 *p)
{
	u8 SD_BIN_BUF[2240]; //设定为屏幕水平分辨率*8
	u16 BinNum=0;  //地址累加记忆  
	FATFS fs;  
	FIL fid;
	FRESULT res;
	disk_initialize(0);						     //fatfs可以管理多个介质的分区
	f_mount(0, &fs);							     //将文件系统设置到0区 		 	  
	res = f_open(&fid,(const char*)p,FA_READ);

	if(res != FR_OK) //如果打开失败
	 {
		
    }
	else
	{
		while(1) //从BIN文件中读取数据 
		{				
			u32 ByteOfRead;
			f_read(&fid,(u8*)SD_BIN_BUF,w*8*sizeof(u8),&ByteOfRead);
			if(ByteOfRead==0)break;	
			LCD_ShowPicture(x,y+BinNum*4,w,4,SD_BIN_BUF);
			BinNum++;													
		}	
   }
}

extern  lv_font_t lv_font_14;

int main(void)
{

	//NVIC_SetVectorTable(0x08007000,0x00);//flash内存地址
	delay_init();
	LED_Init();//LED初始化
	KEY_Init();//按键初始化
	Encoder_Init();//编码器初始化
	LCD_Init();//LCD初始化


    SC_GUI_Init(LCD_DrawPoint,0,C_WHITE,C_RED,(lv_font_t*)&lv_font_14);

    SC_Clear(0,0,LCD_SCREEN_WIDTH-1,LCD_SCREEN_HEIGHT-1);

   // sc_create_task(0,ui_home1_key,500);
	while(1)
	{

		  SC_GUI_test();
//		  system_tick++;
//        delay_ms(1);
//        sc_task_loop();


	}

//    mem_init();//初始化内存池	
//	LCD_Fill(0,0,LCD_W,LCD_H,BLACK);
//	Show_BMP();delay_ms(500);//显示DAPSCNC LOGO
	
//	while(1)//DMA刷屏测试
//	{
//	LCD_Fill(0,0,LCD_W,LCD_H,BLUE);delay_ms(100);
//	LCD_Fill(0,0,LCD_W,LCD_H,RED);delay_ms(100);
//////	LCD_DMA_Fill_COLOR(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 *color)//DMA矩形颜色填充 LVGL图形库移植调用
//	}
	
	
//	
//	//检测SD卡并显示大小
//	LCD_Fill(0,0,LCD_W,LCD_H,WHITE);delay_ms(10);
//	LCD_ShowString(56,200,"SD Checking...",BLACK,WHITE,16,0);
//	if(SD_Initialize())//检测不到SD卡
//	{
//    LCD_ShowString(56,200,"SD Error       ",BLACK,WHITE,16,0);
//	delay_ms(200);
//	}
//	else 
//	{
//		LCD_ShowString(56,200,"SD OK         ",BLACK,WHITE,16,0);
//		sd_size=SD_GetSectorCount();
//		LCD_ShowString(200,200,"MB",BLACK,WHITE,16,0);
//		LCD_ShowIntNum(160,200,sd_size>>11,5,BLACK,WHITE,16);//显示SD卡容量	
//	}
//	delay_ms(1000);
//	
//	
//  //读取SD卡bin图片显示
//     Show_picture(0,0,280,240,"XHR.bin");	delay_ms(100);
//	 Show_picture(0,0,280,240,"HMBB.bin");	delay_ms(100);
//     Show_picture(0,0,280,240,"PIC.bin");	delay_ms(100);
//	 Show_picture(0,0,280,240,"F35.bin");	delay_ms(100);
//	
//	
//	//读取SD卡TXT文本文件并显示
//	  LCD_Fill(150,85,260,180,WHITE);
//		Show_file("test.txt");
//	
//	//显示SD卡里小分辨率的图
//    Show_picture(20,100,128,128,"girl.bin");
//	  
//	//显示芯片内部flash中的小分辨率图
//	LCD_ShowPicture(10,20,40,40,(u8*)gImage_1);

//	
//	//循环 显示选装正方体和一个小的刷屏
//	while(1)
//	{
//		LCD_Fill(120,20,160,60,GBLUE);
//		Draw_Cube(53,10,BLACK,WHITE);//显示旋转正方体
//		LCD_Fill(120,20,160,60,BLUE);delay_ms(10);
//		LCD_ShowIntNum(160,200,TIM_GetCounter(TIM2),5,BLACK,WHITE,16);//显示编码器值
//		if(KEY()==1)LCD_Fill(210,200,226,216,BLUE);
//		else LCD_Fill(210,200,226,216,RED);
//		
//  }


	

}



